home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / C / SQRT.ZIP / SQRT.C next >
Encoding:
C/C++ Source or Header  |  1996-03-11  |  1.7 KB  |  69 lines

  1. /* Fast Square Root using derivatives      
  2.    Coded By Noble Roman / DiGiTaLuS                   
  3.    Email for questions thomas@unix.cde.com 
  4.    Coded in DJGCC on March 9                   */
  5.  
  6. /* This function returns the Square Root of
  7.    the number given in 16.16 fixed point
  8.    math.  The number supplied must also be
  9.    in 16.16 fixed point math.  You must call
  10.    the table(); before using it.  The numbers
  11.    returned are not precise at all but will
  12.    work very well.  Numbers can range from 0
  13.    to 300.  You can increase this if you feel
  14.    the need. It is not optimized, since I
  15.    didn't feel like it.                        */
  16.  
  17. #include <pc.h>
  18. #include <stdio.h>
  19. #include <stdlib.h>
  20.  
  21. unsigned long SQRTAB[17];
  22.  
  23. unsigned long SQRT(unsigned long NUM);
  24.  
  25. unsigned long SQRT(unsigned long NUM)
  26. {
  27.      unsigned int t,d;
  28.      unsigned long ANS,dx,e;
  29.      long c;
  30.      e=0xfff;     /* Big number so don't pick zero as then answer */
  31.      dx=0;        /* If zero really is the answer :) */
  32.      for(t=0;t<17;t++)
  33.      {
  34.           c=SQRTAB[t]-NUM; /* Make c the diff between t^2 and num */
  35.           if(c & 65536)   /* Get the abs */
  36.                c=c^65536;
  37.           if(c<e) /* If c is less than e then make d=t */
  38.                d=t;
  39.           e=c;    /* Make e=c so we can find the closest match */
  40.      }
  41.      dx=NUM-SQRTAB[d];
  42.      d=d<<16; /* Make d fixed point */
  43.      ANS=d;
  44.      ANS+=dx/(2*d);
  45.      return(ANS);
  46. }
  47.  
  48. void table()
  49. {
  50.      int t;
  51.      for(t=0;t<17;t++)
  52.      {
  53.           SQRTAB[t]=t*t;
  54.           SQRTAB[t]=SQRTAB[t]<<16; /* Make it 16.16 */
  55.      }
  56. }
  57.  
  58. unsigned int ABS(int a)
  59. {
  60.      if(a & 65536)
  61.           a=a|65536;
  62.      return(a);
  63. }
  64.  
  65.  
  66.  
  67.  
  68.  
  69.